package cn.lcsjsxy.yxc.objectoriented.运算符的回顾;

/**
 * == 和 equals（）的区别
 * <p>
 * ==：运算符
 * 1.可以使用在基本数据类型和引用型变量中
 * 2.如果比较的是基本数据类型变量：比较两个变量保存的数据是否相等。（不一定类型要相同）
 *   如果比较的是引用数据类型变量，比较两个对象的地址值是否相同,即两引用是否指向同一个对象实体。
 * 二、equals()方法的使用。
 * 1.是一个方法，而非运算符
 * 2.只能适用于引用数据类型
 * 3.Object类中equals()的定义：
 *   说明：Object类中定义的equals()和==的作用是相同的：比较
 * 4.像String、Date、file、包装类等都重写了Object类厚葬的equals（）方法。重写以后，比较的不是两个
 * 引用的地址是否相同，而是比较两个对象的“实体内同”是否相同。
 * 5.通常情况下，我们自定义的类如果使用equals（）的话，也通常是比较两个对象的“是体内同”是否相同。那么，我们就
 * 需要对Object类中的equals（）进行重写（自动生成更好些）
 *
 * 重写equals（）方法的原则
 * 对称性：如果x.equals(y)返回是“true”，那么y.equals(x)也应该返回是“true”
 * 自反性：x.equals(x)必须返回是“true”
 * 传递性：如果x.equals(y)返回是"true"，而且y.equals(z)返回是“true”，那么z.equals(x)也应该返回是“true”
 * 一致性：如果x.equals(y)返回时“true”，只要x和y的内容一直不变，不管你重复x.equals（y）多少次，返回值都是“true”
 * 任何情况下，x.equals(null)，永远返回是“false”
 * x.equals(和x不同类型的对象）永远返回是“false”
 */
public class EqualsTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 10;
        double d = 10.0;
        System.out.println(i == j);  //true
        System.out.println(i == d);  //true
        boolean b = true;
        //System.out.println(i==b);
        char c = 10;
        System.out.println(i == c);  //true

        Person person=new Person("cn/lcsjsxy/yxc",17);
        Person person1=new Person("cn/lcsjsxy/yxc",17);
        System.out.println(person==person1);  //false
        System.out.println(person.equals(person1.toString()));  //false，重写equals后为true
        System.out.println(person.getName().equals(person1.getName()));  //true
    }
}
